iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 20

IT 邦鐵人賽 Day 20-Flyweight

  • 分享至 

  • xImage
  •  

Flyweight(蠅量模式)

如果一個類別實例可以用來提供許多虛擬實例,那就使用蠅量模式。

簡言之:多個物件共享同份狀態

情境:

五子棋遊戲

每個棋子都有標示位置的x與y以及顏色

問題:每個棋子實例都記錄著自己的狀態,而導致棋子一多時程式執行緩慢(因為內存不夠)
改善方法:只使用一個棋子實例,讓用戶端物件負責維護每個棋子的狀態


外在與內在狀態

起初設計

拆分

結果

適用情境:

  1. 生成大量相似的物件(導致內存耗盡)
  2. 對象內含有可抽取且其他對象也共享的重複狀態

好處:

  1. 減少執行期的物件數量,節省記憶體
  2. 將許多虛擬物件的狀態集中在一個位置

壞處:

  1. 類別內的每一個邏輯實例都沒辦法展現與別的實例不一樣的行為

Flyweight 與 Singleton的比較

  1. Singleton只會有一個實體,Flyweight可以有多個
  2. Singleton 物件的狀態為可變,而 Flyweight 物件(存放共通狀態的地方)為不可變

上一篇
IT 邦鐵人賽 Day 19-Facade
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言